package com.tengju.bff.interfaces.shared;

import com.tengju.support.domain.shared.JsonUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;


@Data
@ApiModel(value = "TableVO", description = "表格对象")
public class TableVO {

    @ApiModelProperty(value = "表头")
    private List<ColumnVO> header;

    @ApiModelProperty(value = "行数据")
    private List<Map<String, Object>> records;

    @ApiModelProperty(value = "分页数据")
    private PageResultVO page;

    public TableVO page(int total, int pageIndex, int pageSize) {
        PageResultVO pageTemp = new PageResultVO();
        pageTemp.setPageSize(pageSize);
        pageTemp.setPageIndex(pageIndex);
        pageTemp.setTotal(total);
        this.page = pageTemp;
        return this;
    }

    public TableVO addColumn(ColumnVO columnVO) {
        if (CollectionUtils.isEmpty(header)) {
            this.header = new ArrayList<>();
        }
        header.add(columnVO);
        return this;
    }

    public void resolveRow(Consumer<Map<String, Object>> consumer) {
        if (CollectionUtils.isEmpty(records)) {
            return;
        }
        records.forEach(consumer);
    }

    /**
     * 添加表头到指定列后面
     * 如果指定列不存在，添加到最后一列
     * 如果指定列为null，添加到第一列
     *
     * @param beforeColumnName - 插入在此表头后一位
     * @param columnVO         - 表头信息
     * @return TableVO - 表格数据
     */
    public TableVO addColumn(String beforeColumnName, ColumnVO columnVO) {
        if (CollectionUtils.isEmpty(header)) {
            this.header = new ArrayList<>();
            header.add(columnVO);
            return this;
        }
        if (StringUtils.isEmpty(beforeColumnName)) {
            header.add(0, columnVO);
            return this;
        }
        for (int i = 0; i < header.size(); i++) {
            ColumnVO beforeColumn = header.get(i);
            if (beforeColumn.getProp().equals(beforeColumnName)) {
                header.add(i + 1, columnVO);
                return this;
            }
        }
        header.add(columnVO);
        return this;
    }

    /**
     * 获取表头深度
     *
     * @return 表头宽度
     */
    public int headerDepth() {
        List<Integer> depthList = new ArrayList<>(List.of(0));
        if (!CollectionUtils.isEmpty(header)) {
            int depth = 1;
            for (ColumnVO columnVO : header) {
                columnVO.setDepthList(depthList, depth);
            }
        }
        return Collections.max(depthList);
    }

    /**
     * 获取表头宽度
     *
     * @return 表头宽度
     */
    public int headerWidth() {
        int width = 0;
        if (!CollectionUtils.isEmpty(header)) {
            for (ColumnVO columnVO : header) {
                width = width + columnVO.width();
            }
        }
        return width;
    }

    /**
     * 给所有表头节点填充坐标
     *
     * @param rowFrom 起始的行号
     * @param colFrom 起始的列号
     */
    public void filledRowCol(int rowFrom, int colFrom) {
        int maxDepth = headerDepth();
        for (ColumnVO column : header) {
            column.setRoot(true);
            int width = column.width();
            column.filledRowCol(rowFrom, colFrom, maxDepth);
            colFrom = colFrom + width;
        }
    }

    /**
     * 获取所有的表头
     *
     * @return 所有节点的集合
     */
    public List<ColumnVO> allHeader() {
        List<ColumnVO> result = new ArrayList<>();
        if (!CollectionUtils.isEmpty(header)) {
            for (ColumnVO column : header) {
                result.addAll(column.allColumn());
            }
        }
        return result;
    }

    /**
     * 获取所有的子节点
     *
     * @return 子节点的集合
     */
    public List<ColumnVO> allChildHeader() {
        List<ColumnVO> result = new ArrayList<>();
        if (!CollectionUtils.isEmpty(header)) {
            for (ColumnVO column : header) {
                column.setAllChildColumn(result);
            }
        }
        return result;
    }


    public static void main(String[] args) {
        TableVO tableVO = new TableVO();
        ColumnVO of1 = ColumnVO.of("a1", "a1", List.of(ColumnVO.of("b1", "b1", List.of(ColumnVO.of("c1", "c1"), ColumnVO.of("c2", "c2"))), ColumnVO.of("b2", "b2", List.of(ColumnVO.of("c3", "c3"), ColumnVO.of("c4", "c4")))), true);

//        ColumnVO of = ColumnVO.of("a1", "a1", List.of(ColumnVO.of("a2", "a2", List.of(ColumnVO.of("a3", "a3", List.of()))), ColumnVO.of("a2", "a2", List.of(ColumnVO.of("a3", "a3", List.of())))));
        tableVO.addColumn(of1);
        tableVO.filledRowCol(1, 1);
        List<ColumnVO> allHeader = tableVO.allHeader();
        tableVO.filledRowCol(0, 0);
        System.out.println(JsonUtil.toJSONString(tableVO));
        System.out.println(tableVO.headerDepth());
        System.out.println(tableVO.headerWidth());
    }

    public TableVO removeColumn(String columnName) {
        if (StringUtils.isEmpty(columnName)) {
            return this;
        }
        List<ColumnVO> newHeader = new ArrayList<>();
        for (ColumnVO columnVO : header) {
            if (!columnVO.prop.equals(columnName)){
                newHeader.add(columnVO);
            }
        }
        this.header = newHeader;
        return this;
    }
}